#include "StringUtil.h"
#include <Windows.h> // 用于WideCharToMultiByte函数

string StringUtil::DuiStringToStdString(const CDuiString &duiStr)
{
    // 处理空字符串情况
    if (duiStr.IsEmpty())
    {
        return "";
    }

    // 获取CDuiString的宽字符指针（DuiLib的CDuiString内部是wchar_t存储）
    const wchar_t *wstr = duiStr.GetData();

    // 第一步：计算转换为UTF-8所需的字节数（包括终止符）
    int utf8Len = WideCharToMultiByte(
        CP_UTF8,         // 目标编码为UTF-8
        0,               // 转换标志（无特殊处理）
        wstr,            // 源宽字符串
        -1,              // 自动计算源字符串长度（包含终止符）
        nullptr,         // 临时缓冲区（先不分配）
        0,               // 临时长度（0表示计算长度）
        nullptr, nullptr // 默认替换字符（不使用）
    );

    if (utf8Len <= 0)
    { // 转换失败处理
        return "";
    }

    // 第二步：分配缓冲区并执行转换
    char *utf8Buffer = new char[utf8Len];
    WideCharToMultiByte(
        CP_UTF8,
        0,
        wstr,
        -1,
        utf8Buffer, // 目标缓冲区
        utf8Len,    // 缓冲区长度
        nullptr, nullptr);

    // 赋值给std::string（自动截断终止符）
    string stdStr = utf8Buffer;
    // 释放临时缓冲区
    delete[] utf8Buffer;
    return stdStr;
}

// 以下是原文件中未修改的部分（保持原样）
CDuiString StringUtil::StdStringToDuiString(const string &stdStr)
{
    // 处理空字符串情况
    if (stdStr.empty())
    {
        return L"";
    }

    // 获取std::string的多字节字符指针（UTF-8）
    const char *mbStr = stdStr.c_str();

    // 第一步：计算转换为宽字符所需的wchar_t数量（包括终止符）
    int wideLen = MultiByteToWideChar(
        CP_UTF8, // 源编码为UTF-8
        0,       // 转换标志（无特殊处理）
        mbStr,   // 源多字节字符串
        -1,      // 自动计算源字符串长度（包含终止符）
        nullptr, // 临时缓冲区（先不分配）
        0        // 临时长度（0表示计算长度）
    );

    if (wideLen <= 0)
    { // 转换失败处理
        return L"";
    }

    // 第二步：分配缓冲区并执行转换
    wchar_t *wideBuffer = new wchar_t[wideLen];
    MultiByteToWideChar(
        CP_UTF8,
        0,
        mbStr,
        -1,
        wideBuffer, // 目标宽字符缓冲区
        wideLen     // 缓冲区长度
    );

    // 赋值给CDuiString（自动复制宽字符内容）
    CDuiString duiStr = wideBuffer;

    // 释放临时缓冲区
    delete[] wideBuffer;
    return duiStr;
}
